Compilers may be used to transform human readable source code into executable object code in a variety of settings. Source code may include nested loops that involve performing iterative operations (e.g., “iterations”) within other iterative operations (e.g., “loop nests”). Conventional compilers may linearize (e.g., “flatten”) loop nests in order to facilitate parallel processing of the resulting object code by multiple threads of a computing system. When encountering loop nests, however, conventional compilers create an extra process that runs within each loop and facilitates the recovery of the pre-linearization indices of the loop. The extra process may involve performing division and modulus operations that increase the overhead of parallelization and in turn reduce overall performance.